# 用户在没有登陆的时候可以添加商品值购物车
# 用户在结账的时候，需要登陆账号后者第三方登陆，此时需要将cookie中的数据保存在redis中
# 定义函数讲完成此项功能
import pickle,base64
from django_redis import get_redis_connection

def merge_cart_cookie_to_redis(request, user, response):
    """
    遇到cookie与redis中出现相同的商品时以cookie数据为主，覆盖redis中的数据
    :param request:用户的请求对象  用于获取cookie
    :param user:当前登录的用户  用于获取redis购物车
    :param response: 响应对象[因为我们在函数内部操作了cookie需要返回给客户端]
           该函数使用具体调用见user.views, 重写了post方法，由于post有返回的参数response
           所以在此函数中，response作为变量
    :return: 响应对象，用于清楚购物车cookie
    """
    # 获取cookie中的购物车
    cookie_cart = request.COOKIES.get('cart')
    if not cookie_cart:
        return response

    # 解析cookie购物车数据
    cookie_cart = pickle.loads(base64.b64decode(cookie_cart.encode()))

    redis_conn = get_redis_connection("cart")
    pl = redis_conn.pipeline()
    # 直接遍历cookie中的购物车，把同样sku_id的数据设置到redis中
    for sku_id, sku_dict in cookie_cart.items():
        # 1. 先覆盖cart_<user_id>对应的sku商品信息
        # hset　　设置hash数据中指定键中对应的下标的值
        pl.hset("cart_%s" % user.id, sku_id, int(sku_dict["count"]) )
        if sku_dict["selected"]:
            pl.sadd("cart_selected_%s" % user.id, sku_id)
        else:
            pl.srem("cart_selected_%s" % user.id, sku_id)

    pl.execute()
    # 遍历覆盖完成以后，直接删除cookie
    response.delete_cookie('cart')

    return response



